#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<math.h>
#include<stdio.h>

using namespace std;


typedef pair < double, double >intervalo;	// (comienzo, fin)
typedef pair < int, int >circulo;	// (posicion, radio)

#define radio second
#define posicion first


void
resolver (int n, int l, int w, vector < circulo > circulos)
{

  vector < intervalo > intervalos;
  for (int i = 0; i < n; i++)
    {
      if (circulos[i].radio * 2 > w)
	{
	  intervalo intervalo;
	  double w2 = (double) w;
	  w2 = w2 * w2;
	  double r2 = (double) circulos[i].radio;
	  r2 = r2 * r2;
	  double off = sqrt (r2 - w2 / 4.0);
	  intervalo.first = circulos[i].posicion - off;
	  intervalo.second = circulos[i].posicion + off;
	 // cout << "intervalo " << intervalo.first << " " << intervalo.second <<endl;
	  // push back es constante (en promedio?)
	  intervalos.push_back (intervalo);
	}
    }


  int numIntervalos = intervalos.size ();
    if(l == 0 && w>0)
    {
    	    if(numIntervalos>0)
    	    	    cout << 1 << endl;
	    else
	    	    cout << (-1) <<endl;
	    return ;
    }
    
  sort (intervalos.begin (), intervalos.end ());


  double cubierto = 0;
  unsigned int j = 0, j_anterior = 0;
  int total = 0;

  
  while (cubierto < l && j < numIntervalos)
    {

      double nuevoLimite = cubierto;

      while (j < numIntervalos && intervalos[j].first <= cubierto)
	{
	  nuevoLimite = (nuevoLimite >=intervalos[j].second) ? nuevoLimite : intervalos[j].second;
	  j++;
	}

      if (j_anterior == j)
	{
	  total = -1;
	  break;
	}

      j_anterior = j;
      cubierto = nuevoLimite;
      total++;

    }

  if (cubierto < l)
    total = -1;

  cout << total << endl;

}


int
main ()
{
  int n, l, w;
  while (scanf ("%d %d %d ", &n, &l, &w) == 3)
    {
      vector < circulo > circulos;
      for (int i = 0; i < n; i++)
	{
	  int pos, r;
	  scanf ("%d %d ", &pos, &r);
	  circulo c;
	  c.posicion = pos;
	  c.radio = r;
	  circulos.push_back (c);

	}
      resolver (n, l, w, circulos);
    }
return 0;
}
